#pragma once
#include "Log.hpp"
#include "INETADDR.hpp"
#include <iostream>
#include <string>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <unistd.h>
#include <memory>
#include <sstream>
#include "Socket.hpp"
#include <jsoncpp/json/json.h>
class Request
{
public:
    Request() {}
    Request(string English)
        : _English(English)
    {
    }
    // string Serialize()
    // {
    //     Json::Value root;
    //     root["English"] = _English;
    //     Json::StyledWriter writer;
    //     string s = writer.write(root);
    //     return s;
    // }
    // bool Deserialize(string &in)
    // {
    //     Json::Value root;
    //     Json::Reader reader;
    //     bool ok = reader.parse(in, root);
    //     if (!ok)
    //     {
    //         return false;
    //     }
    //     _English = root["English"].asString();
    //     return true;
    // }
    string GetEnglish()
    {
        return _English;
    }
    ~Request() {}

private:
    string _English;
};
class Respond
{
public:
    Respond()
    {
    }
    Respond(string Chinese)
        : _Chinese(Chinese)
    {
    }
    // string Serialize()
    // {
    //     Json::Value root;
    //     root["Chinese"] = _Chinese;
    //     Json::StyledWriter writer;
    //     string s = writer.write(root);
    //     return s;
    // }
    // bool Deserialize(string &in)
    // {
    //     Json::Value root;
    //     Json::Reader reader;
    //     bool ok = reader.parse(in, root);
    //     if (ok)
    //     {
    //         _Chinese = root["Chinese"].asString();
    //     }
    //     return ok;
    // }
    void SetChinese(string Chinese)
    {
        _Chinese = Chinese;
    }
    string GetChinese()
    {
        return _Chinese;
    }
    void Show()
    {
        cout << _Chinese << endl;
    }
    ~Respond() {}

private:
    string _Chinese;
};
const string separator = "\r\n";
using func_t = function<Respond(Request &req)>;
class Protocol
{
public:
    Protocol() {}

    Protocol(func_t fun)
        : _func(fun) {}
    // 100\r\n{...}\r\n
    string EnCode(const string &json_str)
    {
        string len = to_string(json_str.size());
        string str = len + separator + json_str + separator;
        return str;
    }
    bool DeCode(string &buffer, string *package)
    {
        // auto pos = buffer.find(separator);
        // if (pos == string::npos)
        //     return false;
        // string package_len_str = buffer.substr(0, pos);
        // int package_len_int = stoi(package_len_str);
        // int target_len = package_len_str.size() + package_len_int + 2 * separator.size();
        // if (buffer.size() < target_len)
        //     return false;
        // *package = buffer.substr(pos + separator.size(), package_len_int);
        // buffer.erase(0, target_len);
        // return true;

        // 查找换行符作为消息结束标志
        size_t pos = buffer.find('\n');
        if (pos == string::npos)
            return false;

        // 提取一行内容（去掉结尾的换行符）
        *package = buffer.substr(0, pos);

        // 移除可能的回车符
        if (!package->empty() && package->back() == '\r')
        {
            package->pop_back();
        }

        // 从缓冲区移除已处理的数据
        buffer.erase(0, pos + 1);
        return true;
    }
    string Execute(string &package)
    {
        // LOG(LogLevel::DEBUG) << "进入到protocol Execute begnin";
        // Request req;
        // bool ok = req.Deserialize(package);
        // if (!ok)
        //     return string();
        // Respond resp = _func(req);
        // // 序列化
        // string json_str = resp.Serialize();
        // // 添加自定义长度
        // string send_str = EnCode(json_str); // 携带长度的应答报文了"len\r\n{Chinese:XXX}\r\n"
        // LOG(LogLevel::DEBUG) << "进入到protocol Execute end";
        // // 返回结果
        // return send_str;

        LOG(LogLevel::DEBUG) << "进入 protocol Execute: " << package;
        Request req(package); // 直接使用接收到的单词
        Respond resp = _func(req);
    
        // 直接返回中文意思，无需JSON序列化
        string response = resp.GetChinese() + "\r\n";
        LOG(LogLevel::DEBUG) << "退出 protocol Execute: " << response;
        return response;
    }
    ~Protocol() {}

private:
    func_t _func;
};